import java.io.*;
import java.util.Arrays;

public class 扫地机器人_二分 {

    static PrintWriter out = new PrintWriter(System.out);
    static BufferedReader ins = new BufferedReader(new InputStreamReader(System.in));
    static StreamTokenizer in = new StreamTokenizer(ins);
    static int N;
    static int K;
    static int[]robots;
    /**
     * 输入
     * in.nextToken()
     * int a= (int)in.nval;
     * <p>
     * 输出
     * out.print();
     * out.flush();
     * <p>
     * 读文件：
     * BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("C:\\Users\\yx\\Desktop\\primes.txt")));
     * String s = br.readLine();s读取每一行数据
     * if (s == null)break;读取文件终止的语句
     **/
    public static void main(String[] args) throws IOException {
        String[] sp = ins.readLine().split(" ");
        N = Integer.parseInt(sp[0]);
        K = Integer.parseInt(sp[1]);
        robots = new int[K];
        for (int i = 0; i < K; i++) {
            in.nextToken();
            robots[i] = (int) in.nval;
        }

        Arrays.sort(robots);
        int l = 0;
        int r = N;
        int ans=0;
        while (l <= r) {
            //二分枚举最少花费时间
            int mid = (l + r) / 2;
            //check为true表示步数偏大，可以减小步数优化，为false表示步数偏小，要增加步数
            if (!check(mid)) {
                ans = mid;
                l = mid + 1;
            } else {
                r = mid - 1;
            }
        }
        System.out.print(2*ans);
    }
    static boolean check(int n){
        //定义一个右边界
        int r=0;
        for (int i = 0; i < K; i++) {
            if(robots[i]-n<=r){
                //此时存在两种情况
                /*
                1、当第i个机器人在第i-1个机器人右边界的右边：
                说明这第i个机器人要扫左边，更新右边界r=r+n
                2、当第i个机器人在第i-1个机器人的左边：
                说明这第i个机器人不用扫左边，只需要扫右边和自己
                更新右边界r=robots[i]+n-1
                （减1是因为机器人自己的位置也要扫）
                 */
                r=Math.min(robots[i]-1,r)+n;
            }else {
                return false;
            }
        }
        return r>=N;
    }
}